package com.hgl.bi.common.utils;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.hgl.bi.common.constant.ErrorCode;
import com.hgl.bi.common.exception.BusinessException;
import org.springframework.beans.BeanUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @program: BI
 * @description: 分页工具类
 * @author: hgl
 * @create: 2025-02-14 12:34
 */
public class ConvertUtil {

    /**
     * 分页转换
     *
     * @param sourcePage  源分页
     * @param targetClass 目标类
     * @param <T>         T
     * @param <R>         R
     * @return Page<R>
     * @author hgl
     */
    public static <T, R> Page<R> convertPage(Page<T> sourcePage, Class<R> targetClass) {
        Page<R> targetPage = new Page<>();
        targetPage.setCurrent(sourcePage.getCurrent());
        targetPage.setSize(sourcePage.getSize());
        targetPage.setTotal(sourcePage.getTotal());

        List<R> targetRecords = sourcePage.getRecords().stream()
                .map(entity -> {
                    try {
                        R vo = targetClass.getDeclaredConstructor().newInstance();
                        BeanUtils.copyProperties(entity, vo);
                        return vo;
                    } catch (Exception e) {
                        throw new BusinessException(ErrorCode.PAGE_CONVERT_ERROR);
                    }
                })
                .collect(Collectors.toList());

        targetPage.setRecords(targetRecords);
        return targetPage;
    }

    /**
     * 列表转换
     *
     * @param sourceList  源列表
     * @param targetClass 目标类
     * @param <T>         T
     * @param <R>         R
     * @return List<R>
     * @author hgl
     */
    public static <T, R> List<R> convertList(List<T> sourceList, Class<R> targetClass) {
        List<R> targetLisit = sourceList.stream()
                .map(entity -> {
                    try {
                        R vo = targetClass.getDeclaredConstructor().newInstance();
                        BeanUtils.copyProperties(entity, vo);
                        return vo;
                    } catch (Exception e) {
                        throw new BusinessException(ErrorCode.LIST_CONVERT_ERROR);
                    }
                })
                .collect(Collectors.toList());


        return targetLisit;
    }

    /**
     * 将源对象转换为目标对象，并支持自定义转换逻辑
     *
     * @param source          源对象
     * @param targetClass     目标对象的类类型
     * @param customConverter 自定义转换逻辑（可选）
     * @param <T>             源对象类型
     * @param <R>             目标对象类型
     * @return 转换后的目标对象
     */
    public static <T, R> R convertObject(T source, Class<R> targetClass, Function<T, R> customConverter) {
        if (source == null) {
            return null; // 如果源对象为空，直接返回 null
        }

        try {
            // 创建目标对象实例
            R target = targetClass.getDeclaredConstructor().newInstance();
            // 使用 BeanUtils 复制属性
            BeanUtils.copyProperties(source, target);

            // 如果提供了自定义转换逻辑，则应用
            if (customConverter != null) {
                return customConverter.apply(source);
            }

            return target;
        } catch (Exception e) {
            throw new BusinessException(ErrorCode.OBJECT_CONVERT_ERROR);
        }
    }
}
